home *** CD-ROM | disk | FTP | other *** search
/ Aminet 20 / Aminet 20 (1997)(GTI - Schatztruhe)[!][Aug 1997].iso / Aminet / comm / www / HTP.lha / HTP / source / msg.c < prev    next >
C/C++ Source or Header  |  1997-06-21  |  4KB  |  167 lines

  1. /*
  2. //
  3. // msg.c
  4. //
  5. // Processing messages (informational, warning, and error)
  6. //
  7. // Copyright (c) 1995-96 Jim Nelson.  Permission to distribute
  8. // granted by the author.  No warranties are made on the fitness of this
  9. // source code.
  10. // Amiga version - 1997 - Geert Bevin
  11. //
  12. */
  13.  
  14. /*
  15. // Because the Linux Gnu compiler doesnt support stdarg.h (at least, the
  16. // copy I have doesnt), htp uses varargs.h, which doesnt support full
  17. // prototyping of variable-argument functions ... this causes tons o' warning
  18. // messages on DOS (and I suspect most ANSI) compilers.  So, to alleviate
  19. // the problem, if this macro is defined, the K&R prototype is used,
  20. // otherwise all other .c modules get the ANSI prototype
  21. */
  22. #define DUMB_MSG_PROTOTYPE
  23.  
  24. #include "htp.h"
  25.  
  26. /* symbols used to express severity of message */
  27. const char *severitySymbol[3] =
  28. {
  29.     "[-]",
  30.     "[*]",
  31.     "[!]",
  32. };
  33.  
  34. /* the current severity level (any message of this level or higher is printed */
  35. uint severityLevel = MSG_INFO;
  36.  
  37. /* set severity level */
  38. void SetMessageSeverityLevel(uint level)
  39. {
  40.     if(level > MSG_ERROR)
  41.     {
  42.         severityLevel = MSG_ERROR;
  43.     }
  44.     else
  45.     {
  46.         severityLevel = level;
  47.     }
  48. }
  49.  
  50. void HtpMsg(va_alist) va_dcl
  51. {
  52.     va_list argptr;
  53.     char *str;
  54.     uint level;
  55.     TEXTFILE *textFile;
  56.     const char *format;
  57.  
  58.     /* allocate room for string ... 1K should be large enough, but a more */
  59.     /* deterministic method would be better */
  60.     if((str = AllocMemory(1024)) == NULL)
  61.     {
  62.         return;
  63.     }
  64.  
  65.     /* convert variable arguments into single string */
  66.     va_start(argptr);
  67.     level = va_arg(argptr, uint);
  68.     textFile = va_arg(argptr, TEXTFILE *);
  69.     format = va_arg(argptr, const char *);
  70.     vsprintf(str, format, argptr);
  71.     va_end(argptr);
  72.  
  73.     /* check severity level */
  74.     if(level < severityLevel)
  75.     {
  76.         FreeMemory(str);
  77.         return;
  78.     }
  79.  
  80.     /* print the standard message header followed by formatted message */
  81.     printf("%s ", severitySymbol[level]);
  82.     if(textFile != NULL)
  83.     {
  84.         printf("%s line %d: ", textFile->name, textFile->lineNumber);
  85.     }
  86.     printf("%s\n", str);
  87.  
  88.     /* free the string and exit */
  89.     FreeMemory(str);
  90. }
  91.  
  92. FILE *debugMsgFile = NULL;
  93.  
  94. void DebugInit(const char *debugMsgFilename)
  95. {
  96.     remove(debugMsgFilename);
  97.     debugMsgFile = fopen(debugMsgFilename, "at");
  98.  
  99.     if(debugMsgFile == NULL)
  100.     {
  101.         printf("htp: unable to open debug file \"%s\", aborting\n",
  102.             debugMsgFilename);
  103.         exit(1);
  104.     }
  105. }
  106.  
  107. void DebugTerminate(void)
  108. {
  109.     if(debugMsgFile != NULL)
  110.     {
  111.         fclose(debugMsgFile);
  112.         debugMsgFile = NULL;
  113.     }
  114. }
  115.  
  116. /*
  117. // DebugMsg
  118. //
  119. // DebugMsg is a helper function to (a) log a formatted string to disk and
  120. // (b) display the same string to the screen.  This function is called by
  121. // DEBUG_PRINT, which is normally removed from the code in a final release
  122. // build.
  123. //
  124. // Because this debug information is really most useful when the program
  125. // is coughing up blood, this function will flush contents every time,
  126. // doing whatever it can to get the debug string to disk.  Slow, but that's
  127. // what a debug build is for.
  128. //
  129. // Important: this file can't use the abstraction present in textfile.c
  130. // because *that* module uses DEBUG_PRINT as well ... (same for suballoc.c
  131. // functions)
  132. //
  133. */
  134. void DebugMsg(va_alist) va_dcl
  135. {
  136.     va_list argptr;
  137.     char *str;
  138.     const char *format;
  139.  
  140.     /* 1K should be enough, but no guarantees */
  141.     if((str = malloc(1024)) == NULL)
  142.     {
  143.         /* !! gaaak */
  144.         return;
  145.     }
  146.  
  147.     /* convert variable arguments into single string */
  148.     va_start(argptr);
  149.     format = va_arg(argptr, const char *);
  150.     vsprintf(str, format, argptr);
  151.     va_end(argptr);
  152.  
  153.     /* write the string to disk */
  154.     fprintf(debugMsgFile, str);
  155.  
  156.     /* flush it out to disk */
  157.     fflush(debugMsgFile);
  158.  
  159. #if 0
  160.     /* write it to screen */
  161.     printf(str);
  162. #endif
  163.  
  164.     free(str);
  165. }
  166.  
  167.